package Modelo;

import java.io.PrintStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Vector;
import java.lang.NumberFormatException;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
//import vista.VistadeSeccion;

import Modelo.Estudiante;
public class Seccion { 

private String NroSeccion;
public static Profesor Prof;
public static Vector<Estudiante> Listado_estudiante= new Vector<Estudiante>();

static BufferedReader lector = new BufferedReader(new InputStreamReader(System.in));

//private VistaSeccion vista;


public Vector<Estudiante> getListado_estudiante() {
	return Listado_estudiante;
}
public void setListado_estudiante(Vector<Estudiante> listado_estudiante) {
	Listado_estudiante = listado_estudiante;
}

public String getNroSeccion() {
	return NroSeccion;
}
public void setNroSeccion(String nroSeccion) {
	NroSeccion = nroSeccion;
}
public Profesor getProfesor() {
	return Prof;
}
public void setProfesor(Profesor profesor) {
	Prof = profesor;
}



	private static boolean validarcedula(String Ced){
		boolean valida=false;
		int resp;
		String numero="VEve-0123456789";
		char caracter;
		if(Ced.length()==10){
	    for(int i=0;i<Ced.length();i++){
	    	caracter=Ced.charAt(i);
	        resp=numero.indexOf(caracter);
	    	if(resp!=-1)
	    	valida=true;
	      }
		}
		return valida;
		}

	public boolean ValidarNros(String nro) {
		boolean correcto = false;
		try {
			if (nro.length() <= 8)
			{
		        nro = nro.trim();
		        Long.parseLong(nro);
		        correcto = true;
			}
		    } catch (NumberFormatException nfe) {
			correcto = false;
		    } catch (Exception err) {
			System.out.println("Una excepcion ocurrio en el proceso de validacion");
			correcto = false;
		    }
		   if (!correcto) {
		   System.out.println("Ocurrio un error, solo puede ingresar numeros en este campo");
		    }
		   return correcto;
	}
	
	
	public boolean ValidarLetras(String cadena) {
		 	String nombre;
			boolean algunDigito = false;
		    boolean algunaLetra = false;
			boolean cadenaCorrecta = false;
			nombre=cadena;
		        for (int i = 0; i < nombre.length(); i++) {
		            if (Character.isDigit(nombre.charAt(i))) {
		                algunDigito = true;
		            } else {
		                algunaLetra = true;
		            }
		        }
		        if(algunDigito && !algunaLetra){
		            System.out.println("No es permitido ingresar numeros");
			    cadenaCorrecta = false;
		        }else if (algunDigito){
		            System.out.println("No es permitido ingresar numeros");
			    cadenaCorrecta = false;
		        }else{
			    cadenaCorrecta = true;
		        }  
			return cadenaCorrecta;
		}
		
	private static String validarSN(String resp,String titulo) throws IOException{
		do{
		   System.out.println(titulo);
		   resp=lector.readLine();
		   }while(!((resp.toLowerCase().equals("s")) || (resp.toLowerCase().equals("n"))));
		return resp;
		};		
	
	public boolean buscar(String ced){
		Estudiante Estudiante;
		boolean encontrado=false;
		for(int i=0;i<Listado_estudiante.size();i++){
		   Estudiante= Listado_estudiante.elementAt(i);
		   String cedula=Estudiante.getCedula();
		   if(ced.equals(cedula)){
		      encontrado=true;
			  break;
				                 }
				                        }
		return encontrado;
		};
		public int buscarPosicion(String Cedula){
			int pos;
			Estudiante Estudiante;
			for(pos=0;pos<Listado_estudiante.size();pos++)
			{
			   Estudiante= Listado_estudiante.elementAt(pos);
			   String cedula=Estudiante.getCedula();
			      if(Cedula.equals(cedula)){
				     break;
			      }  
			      }
			return pos;
			}
		
	
		public void AsignarSeccion()throws IOException {
			boolean validar;
			String NroSec,resp="";
			//String cedula,nombre,apellido;
				   System.out.println("Ingrese numero de la seccion: "+"\t");
			 	   NroSec = lector.readLine();
				   validar = ValidarNros(NroSec);
			       resp=validarSN(resp,"Desea asignarle un profesor ahora(s/n)? : "); 
			       if(resp.toLowerCase().equals("s"))
			           AsignarunProfesor();
			           resp=validarSN(resp,"Desea Registrar un alumno(s/n)? : "); 	 
			             if(resp.toLowerCase().equals("s"));
				            //InscribirunEstudiante(String cedula, String nombre, String apellido);
			 }



public  void AsignarunProfesor() throws IOException{
	boolean validar;
	String Nom, Ced, Apel, Tit;
	if (this.Prof != null)
		System.out.print("La seccion ya tiene un profesor asignado\n");
	else{
		do{
			   System.out.println("Cedula: "+"\t");
		       Ced = lector.readLine();
			   validar=validarcedula(Ced);   
			   System.out.println("Nombre: "+"\t");
		       Nom = lector.readLine();
			   validar=ValidarLetras(Nom);
			   System.out.println("Apellido: "+"\t");
		       Apel = lector.readLine();
			   validar=ValidarLetras(Apel);
		 	
			   System.out.println("Titulo: "+"\t");
		       Tit = lector.readLine();
			   validar=ValidarLetras(Tit);
		 	}while(validar == false);
Profesor Profesor=new Profesor(Ced, Nom, Apel, Tit);
setProfesor(Profesor);	
	}	
}

//public void InscribirEstudiante(String cedula, String nombre, String apellido)throws IOException {
	//String nomb, apell, ci;
	//ci = cedula ;
	 //nomb = nombre;
	 //apell = apellido;
	 //Estudiante AuxEst=new Estudiante(ci, nombre, apellido);
	 //Listado_estudiante.addElement(AuxEst);
	 
//};
	

public void InscribirunEstudiante(String cedula, String nombre, String apellido)throws IOException {
	String ci,nomb,apell;
	boolean validar, enc;
	  ci=cedula ;
	  nomb=nombre;
	  apell=apellido;
	
	
	//System.out.println("\t\tInscripcion del estudiante a la seccion");
	//System.out.println("\t\tIngrese la cedula del estudiante");
	 //ci = lector.readLine();
	   validar=validarcedula(ci);
		 enc=buscar(ci);
		 if (enc==true)
		  System.out.println("\t\tEl estudiante ya se encuentra inscrito");
		 else{
			// System.out.println("\t\tIntroduzca el Nombre");
			// nomb= lector.readLine();
			//.out.println("\t\tIntroduzca el Apellido");
			//=lector.readLine();
			 Estudiante AuxEst= new Estudiante(ci,nomb,apell);
			//ojo se deberian pasar los parametros
				Listado_estudiante.addElement(AuxEst);
             
		 }
		 
}


public void RetirarunEstudiante(String cedula) throws IOException{
	String  resp="";
	String ci;
 boolean validar ,enc;
	int pos=0;
 do{
	 resp="n";
 
      if (Listado_estudiante.size()== 0)
         {
		System.out.print("\tNo se puede retirar ya que no hay estudiantes inscritos en la seccion"+"\n");
	    System.out.print("\n");
          }
	    else{
		 ci=cedula;
	      //System.out.println("Introduzca la cedula del estudiante a retirar: ");
	       ci = lector.readLine();
	      validar=validarcedula(ci);
	      enc=buscar(ci);
	         if (!enc)
		        System.out.println("El estudiante no se encuentra registrado ");
	               else
	    	        {
	        	    pos=buscarPosicion(ci);
		            Listado_estudiante.removeElementAt(pos);			
	                System.out.println("\tEstudiante retirado con exito "+"\t");
                    System.out.println("Desea retirar otro Estudiante(S/N): ");
                    resp=validarSN(resp,"Desea retirar otro alumno(s/n): "); 
	    	        }
	          }
	    }while(resp.toLowerCase().equals("s"));
		
 };
 public  Estudiante BuscarunEstudiante(String Cedula) throws IOException{
	String nombre,apellido,cedula="",resp;
		Estudiante Est=new Estudiante();
		boolean enc ;
		double nfinal;
	 do{
		 resp="n";
		  System.out.println("Introduzca la cedula del estudiante a retirar: ");
	      Cedula = lector.readLine();
	      validarcedula(Cedula);
	      enc=buscar(Cedula);
	         if (!enc)
	     
		    System.out.println("\tEstudiante no encontrado: ");
			else {
				System.out.println("Estudiante encontrado: ");
			    nombre=Est.getNombre();
			    apellido=Est.getApellido();
			    nfinal=Est.getNfinal();
			    System.out.print("\tnombre: "+nombre);
			    System.out.print("\tapellido: "+apellido+"\n");
			    System.out.print("\t\t\tNota final: "+nfinal);
			    }
		        resp=validarSN(resp,"Desea buscar otro alumno(s/n): ");
			     
	}while(resp.toLowerCase().equals("s"));	
		
    return Est;
 };


	 
	public void AplicarlasEvaluaciones(){
		Estudiante Est;
		Listado_estudiante = getListado_estudiante();
		System.out.println("VECTOR " + Listado_estudiante.size());
		System.out.println("CEDPROF " + this.Prof.getNombre());
       if ((this.Prof != null) && (Listado_estudiante.size()> 0))
       {
		for(int i=0;i<Listado_estudiante.size();i++){
			Est = Listado_estudiante.elementAt(i);
			Est.PresentarEvaluacion();	
		}
		Profesor Prof = this.Prof;
		for(int i=0;i<Listado_estudiante.size();i++){
			Est = Listado_estudiante.elementAt(i);
			Prof.EvaluarEstudiante(Est);			
			System.out.println("Cedula " + Est.getCedula() + "\t Estatus " + Est.getEstatus());
		}
		JOptionPane.showMessageDialog(new JFrame(),"Evaluacion Completada","Informacion",
				JOptionPane.INFORMATION_MESSAGE);
		}
		else
		{
			if (this.Prof== null)
				System.out.println("\t Debe asignar un profesor...");
			else
				System.out.println("\t La seccion esta vacia...");	
		}
	};


	
	public void OrdenarlosEstudiantesporCedula(){
		int resp;
		String ci;
		//Listado_estudiante=getListado_estudiante();
		Estudiante Estudiante1=new Estudiante();	
		Estudiante Estudiante2=new Estudiante();	
	    String ced1,ced2;
	    
	    
	  //If (Listado_estudiante.size()>0){
	  
		  //System.out.println("No puede mostrar listado porque no hay estudiantes inscritos");
	  //else
		for(int i=0;i<Listado_estudiante.size();i++){
			Estudiante1=Listado_estudiante.elementAt(i);
			ced1=Estudiante1.getCedula();
			for(int k=i+1;k < Listado_estudiante.size();k++){
			 Estudiante2=Listado_estudiante.elementAt(k);
			 ced2=Estudiante2.getCedula();
			 resp=compare(ced1,ced2);
				if(resp > 0){
					Listado_estudiante.setElementAt(Estudiante2,i);
					Listado_estudiante.setElementAt(Estudiante1,k);
				           }
			  }	
		   }
	  
				ci= "C:\\Ordenado Por Cedula.txt";
				ImprimirEstudiantes(ci);
			
	    	
	};

public int compare(Object o1, Object o2) {
return o1.toString().compareTo(o2.toString());
}
public void ImprimirEstudiantes(String nombreArchivo){
	try{
	Listado_estudiante=getListado_estudiante();

	Estudiante Estud;
	String cedula, nombre, apellido;
	double nf;
	FileOutputStream salida;
	PrintStream ps;
	salida = new FileOutputStream(nombreArchivo);
	ps = new PrintStream (salida);

	for(int i=0;i < Listado_estudiante.size();i++){
		 Estud = Listado_estudiante.elementAt(i);
		 cedula = Estud.getCedula();
		 ps.print("Cedula: ");
		 ps.println(cedula);
		 nombre = Estud.getNombre();
		 ps.print("Nombre: ");  
		 ps.println(nombre);
		 apellido = Estud.getApellido();
		 ps.print("Apellido: ");
		 ps.println(apellido);
		 nf = Estud.getNfinal();
		 ps.print("Nota final: ");
		 ps.println(nf);
		 ps.println("\n");
		 nf = Estud.getNfinal();
			System.out.print("\n Cedula: "+cedula+"\t"+" ");
			System.out.print("\n Nombre: "+nombre+"\t"+" ");
			System.out.print("\n Apellido: "+apellido+"\t"+" ");
			System.out.print("\n Nota final: "+nf+"\n"+" ");
			System.out.print("\n");
	}
	ps.close();
}catch (Exception e)	{
	System.err.println(e);
}
			
};


public void OrdenarEstudiantesporNotaFinal(){
	Listado_estudiante=getListado_estudiante();
	Estudiante Estudiante1=new Estudiante();	
	Estudiante Estudiante2=new Estudiante();	
	double nota1,nota2;
    String nota;
	
	for(int i=0;i<Listado_estudiante.size();i++){
		Estudiante1=Listado_estudiante.elementAt(i);
		nota1=Estudiante1.getNfinal();
		for(int k=i+1;k < Listado_estudiante.size();k++){
		 Estudiante2= Listado_estudiante.elementAt(k);
		 nota2=Estudiante2.getNfinal();
			if(nota2 > nota1){
				Listado_estudiante.setElementAt(Estudiante2,i);
				Listado_estudiante.setElementAt(Estudiante1,k);
			}
		nota="C:\\Ordenado Por Nota Final.txt";
		ImprimirEstudiantes(nota);
	}

	}
};

public  Vector<Estudiante> ListarEstatus(char x){
	Vector <Estudiante> otrovector = new Vector <Estudiante> ();
	try{
		Estudiante Estud;
		int cont = 0;
		char estatus;
		String cedula, nombre, apellido;
		double nf;
		String nombreA;//  = "C:\\Aprobados.txt";	
		FileOutputStream salida;
		PrintStream ps;
		if (x == 'R'){
			System.out.print("\nListado de Reprobados: "+"\n");
			nombreA = "C:\\Reprobados.txt";	
			salida = new FileOutputStream(nombreA);
			ps = new PrintStream (salida);
		}
		else{
			System.out.print("\nListado de Aprobados: "+"\n");
			nombreA = "C:\\Aprobados.txt";	
			salida = new FileOutputStream(nombreA);
			ps = new PrintStream (salida);}
		if (Listado_estudiante.size()>0) {
		for(int i=0;i < Listado_estudiante.size();i++){
			 Estud = Listado_estudiante.elementAt(i);
			 estatus = Estud.getEstatus();
				if(estatus == x){
					otrovector.addElement(Listado_estudiante.elementAt(i));
					cont ++;
				cedula = Estud.getCedula();
				 ps.print("Cedula: ");
				 ps.println(cedula);
				nombre = Estud.getNombre();
				 ps.print("Nombre: ");
				 ps.println(nombre);
				apellido = Estud.getApellido();
				 ps.print("Apellido: ");
				 ps.println(apellido);
				nf = Estud.getNfinal();
				 ps.print("Nota final: ");
				 ps.println(nf);
				 ps.println("\n");
				System.out.print("\tCedula: "+cedula);
				System.out.print("\tNombre: "+nombre);
				System.out.print("\tApellido: "+apellido);
				System.out.print("\tNota: "+nf+"\n");
				
				};
		}
		ps.close();
	
		}
	
		if (cont == 0)
			System.out.println("\tNo existen registros para este listado"+"\n");

		}catch (Exception err) {
		
			System.out.println("\tNo se puede mostrar el listado porque no hay estudiantes inscritos en la seccion");
		}
		return otrovector; 
		
		}
				
	

public void PromedioNotas()
 {
	double Prom=0, acu=0;
	Estudiante Estud;
	for(int i=0;i < Listado_estudiante.size();i++)
	    {
		 Estud = Listado_estudiante.elementAt(i);
		 acu = acu + Estud.getNfinal();
	    }
	     Prom = acu/Listado_estudiante.size();
	      if ((Listado_estudiante.size()!= 0) && (acu != 0))//(double)Math.round(x*100)/100)
	         System.out.println("\tEl promedio de notas de la seccion es: "+(double)Math.round((Prom *100)/100)+"\n");
	           else
         System.out.println("\tNo hay notas disponibles para promediar, debe aplicar las evaluaciones"+"\n");
    
};

};